package com.weaving.monitor.mapper;

import com.weaving.monitor.entity.PendingPlan;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 待翻品种计划数据访问接口
 * 
 * 功能说明：
 * 1. 定义与待翻品种计划相关的数据库操作接口
 * 2. 提供CRUD（增删改查）操作
 * 3. 支持按机器号、轮次等条件查询计划
 * 
 * 注解说明：
 * - @Mapper: MyBatis注解，标识这是一个Mapper接口
 * - @Param: 用于标注方法参数，在XML映射文件中可以通过参数名引用
 * 
 * 接口方法说明：
 * 1. selectAllPendingPlans: 查询所有待翻品种计划，用于首页展示
 * 2. selectByMachineNumber: 根据机器号查询计划，用于特定机器的计划管理
 * 3. selectByMachineAndRound: 根据机器号和轮次查询特定计划
 * 4. insertPendingPlan: 插入新计划，用于添加新的生产计划
 * 5. updatePendingPlan: 更新计划信息，用于修改计划详情
 * 6. deletePendingPlan: 删除计划，用于移除不需要的计划
 * 7. selectHighPriorityPlans: 查询高优先级计划，用于优先处理
 * 
 * 对应的XML映射文件：PendingPlanMapper.xml
 * 
 * @author 系统开发团队
 * @version 1.0
 * @since 2024-01-01
 */
@Mapper
public interface PendingPlanMapper {
    
    /**
     * 查询所有待翻品种计划
     * 
     * 功能说明：
     * 1. 从pending_plans_dashboard表中查询所有计划记录
     * 2. 返回完整的计划信息列表
     * 3. 主要用于首页展示所有机器的待翻品种计划
     * 
     * @return 所有待翻品种计划的列表
     */
    List<PendingPlan> selectAllPendingPlans();
    
    /**
     * 根据机器号查询待翻品种计划
     * 
     * 功能说明：
     * 1. 根据指定的机器号查询该机器的所有计划
     * 2. 用于获取特定机器的计划列表
     * 3. 支持按机器分组显示计划信息
     * 
     * @param machineNumber 机器编号
     * @return 指定机器的计划列表
     */
    List<PendingPlan> selectByMachineNumber(@Param("machineNumber") Integer machineNumber);
    
    /**
     * 根据机器号和轮次查询计划
     * 
     * 功能说明：
     * 1. 根据机器号和轮次号查询特定的计划
     * 2. 用于获取单个计划的详细信息
     * 3. 支持计划的精确查询和修改
     * 
     * @param machineNumber 机器编号
     * @param roundNumber 轮次编号
     * @return 指定的计划信息，如果不存在则返回null
     */
    PendingPlan selectByMachineAndRound(@Param("machineNumber") Integer machineNumber, 
                                       @Param("roundNumber") Integer roundNumber);
    
    /**
     * 插入待翻品种计划
     * 
     * 功能说明：
     * 1. 向pending_plans_dashboard表中插入新的计划记录
     * 2. 用于添加新的生产计划到系统中
     * 3. 返回影响的行数，通常为1表示插入成功
     * 
     * @param pendingPlan 要插入的计划信息对象
     * @return 影响的行数，1表示插入成功，0表示插入失败
     */
    int insertPendingPlan(PendingPlan pendingPlan);
    
    /**
     * 更新待翻品种计划
     * 
     * 功能说明：
     * 1. 更新pending_plans_dashboard表中的计划记录
     * 2. 用于修改计划的详情、优先级等信息
     * 3. 根据机器号和轮次进行更新操作
     * 
     * @param pendingPlan 包含更新信息的计划对象
     * @return 影响的行数，1表示更新成功，0表示更新失败
     */
    int updatePendingPlan(PendingPlan pendingPlan);
    
    /**
     * 删除待翻品种计划
     * 
     * 功能说明：
     * 1. 从pending_plans_dashboard表中删除指定的计划记录
     * 2. 根据机器号和轮次进行删除操作
     * 3. 用于移除已完成的或不需要的计划
     * 
     * @param machineNumber 要删除计划的机器编号
     * @param roundNumber 要删除的轮次编号
     * @return 影响的行数，1表示删除成功，0表示删除失败
     */
    int deletePendingPlan(@Param("machineNumber") Integer machineNumber, 
                         @Param("roundNumber") Integer roundNumber);
    
    /**
     * 查询高优先级计划
     * 
     * 功能说明：
     * 1. 查询优先级较高的计划
     * 2. 用于优先处理重要的生产计划
     * 3. 支持计划优先级管理
     * 
     * @return 高优先级计划的列表
     */
    List<PendingPlan> selectHighPriorityPlans();
    
    /**
     * 删除所有待翻品种计划数据
     * 
     * 功能说明：
     * 1. 清空pending_plans_dashboard表中的所有数据
     * 2. 用于定时任务中的数据刷新
     * 3. 在重新插入数据前清空旧数据
     * 
     * @return 影响的行数
     */
    int deleteAll();
    
    /**
     * 插入待翻品种计划（简化版）
     * 
     * 功能说明：
     * 1. 向pending_plans_dashboard表中插入新的计划记录
     * 2. 用于定时任务中的批量插入
     * 
     * @param pendingPlan 要插入的计划信息对象
     * @return 影响的行数
     */
    int insert(PendingPlan pendingPlan);
    
    /**
     * 根据机器ID查询待翻品种数据
     * 
     * 功能说明：
     * 1. 通过机器ID查询对应的待翻品种信息
     * 2. 实现复杂的关联查询逻辑
     * 
     * 查询逻辑：
     * 1. 首先通过机器ID查询prod_prod_card表获取order_id（状态为'0'且未删除）
     * 2. 然后通过order_id查询prod_prod_order表获取mat_type_id
     * 3. 最后通过mat_type_id查询mat_cloth_type表获取name
     * 4. 按sort升序排列，取前三条记录
     * 
     * 参数说明：
     * - machineId: 机器ID，如"J021"
     * 
     * 返回值说明：
     * - List<String>: 布种类型名称列表，对应待翻品种
     * - 如果查询失败或参数为空，返回空列表
     * 
     * SQL说明：
     * - 子查询1：从prod_prod_card表获取order_id
     * - 子查询2：从prod_prod_order表获取mat_type_id
     * - 主查询：从mat_cloth_type表获取name
     * - 排序：按sort升序
     * - 限制：取前三条记录
     * 
     * @param machineId 机器ID，如"J021"
     * @return 布种类型名称列表，查询失败时返回空列表
     */
    List<String> selectPendingPlansByMachineId(@Param("machineId") String machineId);
    
    /**
     * 删除指定机器的所有待翻品种计划
     * 
     * 功能说明：
     * 1. 删除指定机器的所有待翻品种计划
     * 2. 用于定时任务中的数据刷新
     * 
     * @param machineNumber 机器编号
     * @return 影响的行数
     */
    int deleteByMachineNumber(@Param("machineNumber") Integer machineNumber);
} 